package main

// 1. [intermediate] 关于channel的特性，下面说法正确的是（）
//A. 给一个 nil channel 发送数据，造成永远阻塞
//B. 从一个 nil channel 接收数据，造成永远阻塞
//C. 给一个已经关闭的 channel 发送数据，引起 panic
//D. 从一个已经关闭的 channel 接收数据，如果缓冲区中为空，则返回一个零值
//参考答案：ABCD

// 2. 一个管道缓存是 10，里面写了5个数据，并没有读出来，此时不再使用这个管道。管道包括里面的数据会被垃圾回收掉吗？

// 3. 管道使用完后必须 close吗？ 不close会有什么问题？
/* 网上搜索的一些结果：
channel必须显示的使用close()方法关闭么?
	由于for range的特性必须要等到close之后才会结束，如果不想通过close结束，可以通过外部条件控制for循环结束，
比如再用一个chan通知结束，或者从chan传过来一个特定的值来判断结束循环，所有使用完之后不再有地方引用的chan会自动被垃圾回收

channel不需要通过close释放资源，只要没有goroutine持有channel，相关资源会自动释放。
	close可以用来通知channel接收者不会再收到数据。所以即使channel中有数据也可以close而不会导致接收者收不到残留的数据。
有些场景需要关闭通道，例如range遍历通道，如不关闭range遍历会出现死锁。
*/

// 4. 一个结构体，里面有两个字段， 一个 byte类型， 一个int64的整形类型
// 那么这个结构体的对象在 64位机器上，占多少字节？
// 涉及到内存对齐，比较基础。 64位机器，每次cpu读取处理8字节。

/*
64位cpu概念：
	64位CPUGPRs的数据宽度为64位，64位指令集可以运行64位数据指令，也就是说处理器一次可提取64位数据(只要两个指令，一次提取8个字节的数据)，
	比32位（需要四个指令，一次提取4个字节的数据）提高了一倍，理论上性能会相应提升1倍

	(64为地址寻址比较大，这个还记得)
	寻址能力不同。64位处理器的优势还体现在系统对内存的控制上。由于地址使用的是特殊的整数，因此一个ALU（算术逻辑运算器）
	和寄存器可以处理更大的整数，也就是更大的地址

内存对齐参考文章：https://zhuanlan.zhihu.com/p/53413177。 结构体就是由这些内部数据组成的。
*/
func main() {

}
